home *** CD-ROM | disk | FTP | other *** search
- #include "::h:gsupport.h"
-
- /*
- * If Bell is not defined, determine the default value for the "bell"
- * character.
- */
- #ifndef Bell
- #ifdef StandardC
- #define Bell '\a'
- #else /* StandardC */
- #if EBCDIC
- #define Bell '\x2F'
- #else /* EBCDIC */
- #define Bell '\007'
- #endif /* EBCDIC */
- #endif /* StandardC */
- #endif /* Bell */
-
- #define CBufSize 256 /* size of buffer for file input */
-
- /*
- * Identification numbers for tokens for which there are no definitions
- * generated from a C grammar by yacc.
- */
- #define WhiteSpace 1001 /* white space */
- #define PpNumber 1002 /* number (integer or real) */
- #define PpIf 1003 /* #if */
- #define PpElse 1004 /* #else */
- #define PpIfdef 1005 /* #ifdef */
- #define PpIfndef 1006 /* #ifndef */
- #define PpElif 1007 /* #elif */
- #define PpEndif 1008 /* #endif */
- #define PpInclude 1009 /* #include */
- #define PpDefine 1010 /* #define */
- #define PpUndef 1011 /* #undef */
- #define PpLine 1012 /* #line */
- #define PpError 1013 /* #error */
- #define PpPragma 1014 /* #pragma */
- #define PpPaste 1015 /* ## */
- #define PpDirEnd 1016 /* new-line terminating a directive */
- #define PpHeader 1017 /* <...> from #include */
- #define PpBegdef 1018 /* #begdef */
- #define PpEnddef 1019 /* #enddef */
- #define PpNull 1020 /* # */
- #define PpKeep 1021 /* directive specific to an application, pass along */
- #define PpSkip 1022 /* directive specific to an application discard */
- #define Invalid 9999 /* marker */
-
- extern char *progname; /* name of this program: for error messages */
- extern line_cntrl; /* flag: are line directives needed in the output */
-
- /*
- * whsp_image determines whether the spelling of white space is not retained,
- * is retained with each comment replaced by a space, or the full spelling
- * of white space and comments is retained.
- */
- #define NoSpelling 0
- #define NoComment 1
- #define FullImage 2
-
- extern int whsp_image;
-
- extern int max_recurse; /* how much recursion is allows in macros */
- extern struct token *zero_tok; /* token "0" */
- extern struct token *one_tok; /* token "1" */
-
- extern int *first_char; /* first character in tokenizing buffer */
- extern int *next_char; /* next character in tokenizing buffer */
- extern int *last_char; /* last character in tokenizing buffer */
-
- /*
- * Entry in array of preprocessor directive names.
- */
- struct rsrvd_wrd {
- char *s; /* name (without the #) */
- int tok_id; /* token id of directive */
- };
-
- /*
- * token flags:
- */
- #define LineChk 0x1 /* A line directive may be needed in the output */
- #define NoExpand 0x2 /* Don't macro expand this identifier */
-
- /*
- * Token.
- */
- struct token {
- int tok_id; /* token identifier */
- char *image; /* string image of token */
- char *fname; /* file name of origin */
- int line; /* line number of origin */
- int flag; /* token flag, see above */
- };
-
- /*
- * Token list.
- */
- struct tok_lst {
- struct token *t; /* token */
- struct tok_lst *next; /* next entry in list */
- };
-
- /*
- * Identifier list.
- */
- struct id_lst {
- char *id; /* identifier */
- struct id_lst *next; /* next entry in list */
- };
-
- /*
- * a macro, m, falls into one of several categores:
- * those with arguments - m.category = # args >= 0
- * those with no arguments - m.category = NoArgs
- * those that may not be chaged - m.category = FixedMac
- * those that require special handling - m.category = SpecMac
- */
- #define NoArgs -1
- #define FixedMac -2
- #define SpecMac -3
-
- struct macro {
- char *mname;
- int category;
- int multi_line;
- struct id_lst *prmlst;
- struct tok_lst *body;
- int ref_cnt;
- int recurse;
- struct macro *next;
- };
-
- /*
- * states for recognizing preprocessor directives
- */
- #define Reset 1
- #define CanStart 2 /* Just saw a new-line, look for a directive */
- #define Within 3 /* Next new-line ends directive */
-
- /*
- * Information for a source of tokens created from a character stream.
- * The characters may come from a file, or they be in a prefilled buffer.
- */
- struct char_src {
- FILE *f; /* file, if the chars come directly from a file */
- char *fname; /* name of file */
- int bufsize; /* size of character buffer */
- int *char_buf; /* pointer to character buffer */
- int *line_buf; /* buffer of lines characters come from */
- int *next_char; /* next unprocessed character in buffer */
- int *last_char; /* last character in buffer */
- int line_adj; /* line adjustment caused by #line directive */
- int dir_state; /* state w.r.t. recognizing directives */
- struct token *tok_sav; /* used to save token after look ahead */
- };
-
- /*
- * Information for a source of tokens dirived from expanding a macro.
- */
- struct mac_expand {
- struct macro *m; /* the macro being expanded */
- struct tok_lst **args; /* list of arguments for macro call */
- struct tok_lst **exp_args; /* list of expanded arguments for macro call */
- struct tok_lst *rest_bdy; /* position within the body of the macro */
- };
-
- /*
- * Elements in a list of token lists used for token pasting.
- */
- struct paste_lsts {
- struct token *trigger; /* the token pasting operator */
- struct tok_lst *tlst; /* the token list */
- struct paste_lsts *next; /* the next element in the list of lists */
- };
-
- /*
- * Pointers to various token sources.
- */
- union src_ref {
- struct char_src *cs; /* source is tokenized characters */
- struct mac_expand *me; /* source is macro expansion */
- struct tok_lst *tlst; /* source is token list (a macro argument) */
- struct paste_lsts *plsts; /* source is token lists for token pasting */
- };
-
- /*
- * Types of token sources:
- */
- #define CharSrc 0 /* tokenized characters */
- #define MacExpand 1 /* macro expansion */
- #define TokLst 2 /* token list */
- #define PasteLsts 4 /* paste last token of 1st list to first of 2nd */
- #define DummySrc 5 /* base of stack */
-
- #define NTokSav 2 /* maximum number of tokens that can be pushed back */
-
- struct src {
- int flag; /* indicate what kind of source it is */
- struct tok_lst *cond; /* list of nested conditionals in effect */
- struct token *toks[NTokSav]; /* token push-back stack for preproc() */
- int ntoks; /* number of tokens on stack */
- struct src *next; /* link for creating stack */
- union src_ref u; /* pointer to specific kind of source */
- };
-
- extern struct src dummy; /* base of stack */
-
- extern struct src *src_stack; /* source stack */
-
-